[μš°ν…Œμ½”]레벨1 μžλ™μ°¨ κ²½μ£Ό κ²Œμž„ step1 ν›„κΈ°

level1 - μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ΅¬ν˜„ ν•˜λŠ” μžλ™μ°¨ κ²½μ£Ό κ²Œμž„

0. κ΅¬ν˜„ μš”κ΅¬μ‚¬ν•­

🎯 step1

  • 주어진 횟수 λ™μ•ˆ nλŒ€μ˜ μžλ™μ°¨λŠ” 전진 λ˜λŠ” 멈좜 수 μžˆλ‹€.
  • μžλ™μ°¨μ— 이름을 λΆ€μ—¬ν•  수 μžˆλ‹€. μ „μ§„ν•˜λŠ” μžλ™μ°¨λ₯Ό 좜λ ₯ν•  λ•Œ μžλ™μ°¨ 이름을 같이 좜λ ₯ν•œλ‹€.
  • μžλ™μ°¨ 이름은 μ‰Όν‘œ(,)λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜λ©° 이름은 5자 μ΄ν•˜λ§Œ κ°€λŠ₯ν•˜λ‹€.
  • μ‚¬μš©μžλŠ” λͺ‡ 번의 이동을 ν•  것인지λ₯Ό μž…λ ₯ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ „μ§„ν•˜λŠ” 쑰건은 0μ—μ„œ 9 μ‚¬μ΄μ—μ„œ random 값을 κ΅¬ν•œ ν›„ random 값이 4 이상일 경우 μ „μ§„ν•˜κ³ , 3 μ΄ν•˜μ˜ 값이면 λ©ˆμΆ˜λ‹€.
  • μžλ™μ°¨ κ²½μ£Ό κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ λˆ„κ°€ μš°μŠΉν–ˆλŠ”μ§€λ₯Ό μ•Œλ €μ€€λ‹€. μš°μŠΉμžλŠ” ν•œ λͺ… 이상일 수 μžˆλ‹€.
  • μš°μŠΉμžκ°€ μ—¬λŸ¬λͺ…일 경우 ,λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬λΆ„ν•œλ‹€.

1. μ§„ν–‰ν•˜λ©° κ³ λ―Όν•œ 점듀

1-1 κ΅¬ν˜„ 방식에 λŒ€ν•œ κ³ λ―Ό

λ―Έμ…˜μ„ 처음 μ‹œμž‘ν•˜λ©΄μ„œ νŽ˜μ–΄μΈ ν•˜λ£¨μ™€ ν•¨κ»˜ μƒˆλ‘œμš΄ 방식에 λŒ€ν•œ μ–˜κΈ°λ₯Ό λ‚˜λˆ΄μŠ΅λ‹ˆλ‹€. μ§€λ‚œ μ΄ˆκ°„λ‹¨ λ―Έμ…˜, 계산기 λ―Έμ…˜μ„ 진행할 λ•ŒλŠ” λͺ¨λ“  ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ³  κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. μ§€λ‚œ κ°•μ˜μ—μ„œ 쀀이 ν…ŒμŠ€νŠΈμ™€ κΈ°λŠ₯을 λ²ˆκ°ˆμ•„ μž‘μ„±ν•˜λŠ” 것을 보고 κ·Έ 방식을 λ”°λΌν•΄λ³΄κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜λ˜ 쀑 μ˜ˆμƒν•˜μ§€ λͺ» ν–ˆλ˜ λ¬Έμ œμ— λ΄‰μ°©ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  ν•΄λ‹Ή ν…ŒμŠ€νŠΈμ— λŒ€ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ˜ 쀑 ν•˜λ‚˜μ˜ κΈ°λŠ₯ λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” κΈ°λŠ₯듀을 λ§Œλ“€κ²Œ λ˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. λ¨Όμ € κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³  ν•΄λ‹Ή κΈ°λŠ₯에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ²Œ 되면 κΈ°λŠ₯에 λΌμ›Œλ§žμΆ”λ“― ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ²Œ 되고 μ΄λ ‡κ²Œ 되면 TDDλ₯Ό ν•˜λŠ” μ˜λ―Έκ°€ μ—†λ‹€λŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹€μ‹œ μ΄μ „μ²˜λŸΌ λͺ¨λ“  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  κΈ°λŠ₯ κ΅¬ν˜„μ„ ν•˜λŠ” λ°©μ‹μœΌλ‘œ 이번 λ―Έμ…˜μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

1-2 BDD μ•ˆμ˜ TDD

ν•˜λ£¨μ™€ νŽ˜μ–΄ ν”„λ‘œκ·Έλž˜λ°μ„ μ§„ν–‰ν•˜λ©° ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ˜ 쀑 κ°€μž₯ λ§Žμ€ μ–˜κΈ°λ₯Ό λ‚˜λˆˆ 뢀뢄은 μžλ™μ°¨ κ²½μ£Όλ₯Ό μ§„ν–‰ν–ˆμ„ λ•Œ λžœλ€ν•œ 값을 λΆ€μ—¬ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό ν…ŒμŠ€νŠΈ ν•˜λŠ” λΆ€λΆ„μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” 이 뢀뢄을 ν†΅ν•©ν…ŒμŠ€νŠΈλ‘œ μ§„ν–‰ν•˜κ³  μ‹Άμ—ˆκ³  ν•˜λ£¨λŠ” 이 뢀뢄을 ν•˜λ‚˜μ”© λΆ„λ¦¬ν•΄μ„œ ν…ŒμŠ€νŠΈ ν•˜κΈ°λ₯Ό μ›ν–ˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄에 λŒ€ν•΄ λ§Žμ€ μ–˜κΈ°λ₯Ό λ‚˜λˆ΄μ§€λ§Œ κ²°λ‘ μ μœΌλ‘œλŠ” μ•„λž˜μ™€ 같은 μ΄μœ λ“€λ‘œ νŽ˜μ–΄μ˜ μ˜κ²¬μ„ λ”°λ₯΄κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€.

  1. ν†΅ν•©ν…ŒμŠ€νŠΈ κ΅¬ν˜„μ— λ“œλŠ” λΉ„μš©μ΄ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μ—¬λŸ¬κ°œ μž‘μ„±ν•˜λŠ” λΉ„μš©λ³΄λ‹€ 크닀.

    • ν•΄λ‹Ή κΈ°λŠ₯을 톡합 ν…ŒμŠ€νŠΈλ₯Ό 톡해 κ²€μ¦ν•˜κΈ° μœ„ν•΄μ„  λ‹¨μœ„ν…ŒμŠ€νŠΈλ³΄λ‹€ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ”λ° λ“œλŠ” μ‹œκ°„ μ—­μ‹œ λΉ„μš©μ΄λΌλŠ” μΈ‘λ©΄μ—μ„œ μ ‘κ·Όν•˜λ©΄ 두가지λ₯Ό λΉ„κ΅ν–ˆμ„ λ•Œ 적은 λΉ„μš©μ΄ λ“œλŠ” 방법을 μ„ νƒν•˜λŠ” 것이 더 합리적이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.
  2. ν†΅ν•©ν…ŒμŠ€νŠΈμ™€ μ—¬λŸ¬ 개의 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λΉ„κ΅ν–ˆμ„ λ•Œ ν…ŒμŠ€νŠΈμ˜ 신뒰성에 큰 차이가 μ—†λ‹€.

    • μœ„μ˜ μ΄μœ μ™€ λΉ„μŠ·ν•œ μ΄μœ μž…λ‹ˆλ‹€. 두 ν…ŒμŠ€νŠΈμ˜ μ‹ λ’°μ„± 차이가 크지 μ•Šλ‹€λ©΄ λΉ„κ΅ν–ˆμ„ λ•Œ λΉ„μš©μ΄ 적게 λ“œλŠ” μ—¬λŸ¬ 개의 λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ”κ²Œ μ’‹λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 두 λ°©λ²•μ˜ 신뒰성에 큰 차이가 μ—†λ‹€λ©΄ μ—¬λŸ¬ κ°œμœ„ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©° 쑰금 더 readableν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같은 μ΄μœ λ“€λ‘œ λžœλ€ν•œ 값을 λΆ€μ—¬ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” κΈ°λŠ₯은 톡합 ν…ŒμŠ€νŠΈκ°€ μ•„λ‹Œ μ—¬λŸ¬ 개의 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ‘œ μͺΌκ°œμ„œ κ΅¬ν˜„ν•˜λ©° λΉ λ₯΄κ²Œ μž‘μ„±μ„ 마칠 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. BDD, TDD ν•˜λ‚˜μ— λ„ˆλ¬΄ 맀λͺ°λ˜μ§€ μ•Šκ³  상황에 따라 μ μ ˆν•˜κ²Œ 선택할 수 μžˆλ„λ‘ μƒκ°μ˜ 폭을 λ„“νžˆκ³  μ—­λŸ‰μ„ κΈΈλŸ¬μ•Όκ² λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

1-3 cypress μ‹€νŒ¨ 사둀(*μ˜μ‘΄μ„± μžˆλŠ” ν•¨μˆ˜)

κΈ°λŠ₯ κ΅¬ν˜„μ„ ν•˜λ©΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό 톡해 κΈ°λŠ₯을 κ²€μ¦ν•˜λ˜ 쀑 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

it('μžλ™μ°¨ κ²½μ£Όλ₯Ό λ§ˆμ³€μ„ λ•Œ 우승자λ₯Ό μ •μƒμ μœΌλ‘œ 좜λ ₯ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.', () => {
  let winner
  typeCarNameAndSubmit()
  typeRacingCountAndSubmit()

  winner = getWinner()
  cy.get('#game-result-text').should(`πŸ† μ΅œμ’… 우승자: ${winner} πŸ†`)
})

κΈ°λŠ₯ κ΅¬ν˜„μ— μ‚¬μš©ν•œ getWinner()ν•¨μˆ˜λ₯Ό ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œλ„ μ‚¬μš©ν•΄ κ°„λ‹¨ν•˜κ²Œ ν…ŒμŠ€νŠΈλ₯Ό ν•  κ³„νšμœΌλ‘œ μœ„μ™€ 같은 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μœ„ μ½”λ“œμ—μ„œλŠ” typeCarNameAndSubmit(), typeRacingCountAndSubmit() ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κΈ° μ „ getWinner()κ°€ μ‹€ν–‰λ˜λŠ” μ‹œμ μ—μ„œ μžλ™μ°¨ λͺ©λ‘κ³Ό κ²Œμž„ 진행 상황을 λΆˆλŸ¬μ˜€μ§€ λͺ» ν–ˆμŠ΅λ‹ˆλ‹€.

it('랜덀 ν•¨μˆ˜κ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.', () => {
  const possibleScores = Array.from({
    length: GAME.MAX_SCORE - GAME.MIN_SCORE + 1,
  }).map((v, i) => i)

  for (let i = 0; i < 100; i++) {
    expect(possibleScores).to.include(getRandomNumber())
  }
})

λΉ„μŠ·ν•˜κ²Œ getRandomNumber() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ ν…ŒμŠ€νŠΈν•˜λŠ” μœ„ μ½”λ“œμ˜ getRandomNumber() 같은 κ²½μš°λŠ” μ˜μ‘΄μ„± 없이 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” λͺ¨λ“ˆμ΄μ§€λ§Œ getWinner()의 경우 μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” DOM에 μžˆλŠ” μš”μ†Œλ“€μ΄ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— μƒκΈ°λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. async/await λ₯Ό 좔가해보기도 ν•˜λŠ” λ“± μ—¬λŸ¬ 방법을 μ‹œλ„ν–ˆμ§€λ§Œ ν…ŒμŠ€νŠΈλŠ” 계속 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. κ²°κ΅­ setTimeOut() 을 톡해 μž„μ‹œλ°©νŽΈμœΌλ‘œ μ•„λž˜μ™€ 같이 ν…ŒμŠ€νŠΈλ₯Ό κ³ μ³€μŠ΅λ‹ˆλ‹€.

it('μžλ™μ°¨ κ²½μ£Όλ₯Ό λ§ˆμ³€μ„ λ•Œ 우승자λ₯Ό μ •μƒμ μœΌλ‘œ 좜λ ₯ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.', () => {
  let winner

  typeCarNameAndSubmit()

  typeRacingCountAndSubmit()

  setTimeout(() => {
    winner = getWinner()

    cy.get('#game-result-text').should(`πŸ† μ΅œμ’… 우승자: ${winner} πŸ†`)
  }, 1000)
})

μœ„μ™€ 같이 ν…ŒμŠ€νŠΈλ₯Ό 고친 ν›„ βœ…λ₯Ό 보며 일단은 μ‹€ν–‰λ˜λŠ” μƒνƒœκΉŒμ§€λŠ” λ§Œλ“€μ—ˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ 큰 μ°©κ°μ΄μ—ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ©° βœ…κ°€ μƒκΈ΄κ²Œ μ•„λ‹ˆκ³  setTimeOut() κ°€ λ™μž‘ν•˜μ§€ μ•Šκ³  λ„˜μ–΄κ°€λ©΄μ„œ βœ…κ°€ μƒμ„±λ˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ²°κ΅­ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€μ„œ μ‚¬μš©ν•˜λŠ” κ±Έ ν¬κΈ°ν•˜κ³  ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ 직접 DOM을 νŒŒμ‹±ν•΄μ„œ μ‹€ν–‰λ˜λ„λ‘ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

it('μžλ™μ°¨ κ²½μ£Όλ₯Ό λ§ˆμ³€μ„ λ•Œ 우승자λ₯Ό μ •μƒμ μœΌλ‘œ 좜λ ₯ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.', () => {
  typeCarNameAndSubmit()
  typeRacingCountAndSubmit()

  cy.get('.car').then($cars => {
    const counts = [...$cars].map($car => {
      return $car.querySelectorAll('.forward-icon').length
    })
    const maxScore = Math.max(...counts)
    const winners = []
    counts.forEach((carCount, index) => {
      if (carCount === maxScore) {
        winners.push(carNames[index])
      }
    })

    cy.get('#game-result-text').should(
      'have.text',
      `πŸ† μ΅œμ’… 우승자: ${winners.join(', ')} πŸ†`
    )
  })
})

μœ„μ™€ 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  λ‹€μ‹œ ν…ŒμŠ€νŠΈλ₯Ό 톡해 ν™•μΈν•΄λ³΄λ‹ˆ μ΄μ œμ„œμ•Ό μ˜λ„λŒ€λ‘œ ν…ŒμŠ€νŠΈκ°€ λ™μž‘ν•˜λŠ”κ±Έ 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

1-4 ν…ŒμŠ€νŠΈμ½”λ“œμ˜ λΉ„μš©

아직 cypress에 μ΅μˆ™ν•˜μ§€ μ•Šμ•„ κ·ΈλŸ°κ²ƒλ„ μžˆκ² μ§€λ§Œ ν…ŒμŠ€νŠΈ μ½”λ“œ κ΅¬ν˜„κ³Ό κΈ°λŠ₯ κ΅¬ν˜„μ„ 놓고 봀을 λ•Œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° 더 였랜 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ”κ±° κ°™μŠ΅λ‹ˆλ‹€. λ¬Όλ‘  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 미리 κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ λΉ λ₯΄κ²Œ μž‘μ„± κ°€λŠ₯ν•œ 뢀뢄도 μžˆλ‹€. ν•˜μ§€λ§Œ κ²°κ΅­ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ λͺ¨λ“  μ˜ˆμ™Έμ‚¬ν•­μ„ 100% 컀버할 μˆ˜λŠ” μ—†κΈ° λ•Œλ¬Έμ— μ–΄λŠ 정도 μˆ˜μ€€κΉŒμ§€ 컀버할 수 있게 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό 할지에 λŒ€ν•œ 고민을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

이제 막 cypressλ₯Ό 처음 μ‚¬μš©ν•΄λ³΄λ©΄μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 처음 μž‘μ„±ν–ˆκΈ° λ•Œλ¬Έμ— μƒκΈ°λŠ” 고민인거 같기도 ν•©λ‹ˆλ‹€. μ§€μ†μ μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄μ„œ μˆ™λ ¨λ„κ°€ 였λ₯Έλ‹€λ©΄ 이런 고민을 ν•˜μ§€ μ•Šμ•„λ„ 될거 κ°™λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

2. μ½”λ“œ 리뷰 및 ν”Όλ“œλ°±

2-1 debouncing, throttling

step1 debouncing

debouncing, throttling 을 톡해 이벀트λ₯Ό μ œμ–΄ν•  수 μžˆλ‹€λŠ”κ±Έ 리뷰어 뢄이 남겨주신 리뷰λ₯Ό 톡해 처음으둜 μ•Œκ²Œ λμŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ λ‹¨μˆœνžˆ <button>에 클릭이 ν•œλ²ˆ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή λ…Έλ“œμ— disabled 속성을 λΆ€μ—¬ν•΄ μ΄λ²€νŠΈκ°€ λ‹€μ‹œ ν˜ΈμΆœλ˜λŠ”κ±Έ 막고 μžˆλŠ”λ° ν•΄λ‹Ή μ½”λ“œλ₯Ό 보고 이런 기법듀에 λŒ€ν•΄ μ†Œκ°œν•΄μ£Όμ…¨μŠ΅λ‹ˆλ‹€.

  • debouncing : λ§ˆμ§€λ§‰ ν•¨μˆ˜κ°€ 호좜된 ν›„ 일정 μ‹œκ°„ λ™μ•ˆ ν•¨μˆ˜μ˜ ν˜ΈμΆœμ„ λ§‰λŠ” 것.

    • 주둜 ajax 검색에 쓰인닀.
  • throttling :

    • 주둜 μŠ€ν¬λ‘€μ„ μ˜¬λ¦¬κ±°λ‚˜ 내릴 λ•Œ μ‚¬μš©ν•œλ‹€.

이 ν‚€μ›Œλ“œλ₯Ό 잘 κΈ°μ–΅ν•΄λ’€λ‹€κ°€ μ΄λ²€νŠΈκ°€ 단 μ‹œκ°„μ— μ—¬λŸ¬λ²ˆ 호좜 λ˜λŠ” 것을 방지해야할 μƒν™©μ—μ„œ μ‚¬μš©ν•΄λ΄μ•Όκ² λ‹€κ³  생각 ν–ˆμŠ΅λ‹ˆλ‹€.

2-2 ν•¨μˆ˜μ˜ 넀이밍

step1 naming

cypressμ—μ„œ μƒμ„±ν•œ ν•¨μˆ˜μ˜ 넀이밍에 λŒ€ν•œ ν”Όλ“œλ°±μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. cypress의 typeκ³Ό click λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•΄μ£ΌλŠ” ν•¨μˆ˜μΈ 만큼 ν”Όλ“œλ°±λŒ€λ‘œ λ‹¨μˆœνžˆ type...AndSubmitλ³΄λ‹€λŠ” clickμ΄λΌλŠ” 이름이 λ“€μ–΄κ°€λŠ”κ²Œ μ§κ΄€μ μΌκ±°λΌλŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

ν”Όλ“œλ°±μ„ 톡해 ν•¨μˆ˜λ₯Ό μ•„λž˜μ™€ 같이 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

// λ³€κ²½ μ „
const typeCarNameAndSubmit = (){...}
const typeRacingCountAndSubmit = () => {...};

// λ³€κ²½ ν›„
const typeCarNameAndClickToSubmitButton = (){...}
const typeRacingCountAndClickToSubmitButton = () => {...};

μ•žμœΌλ‘œ ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ˜ 넀이밍에 λ”μš± 신경을 써야겠닀고 λŠκΌˆμŠ΅λ‹ˆλ‹€.

2-3 ν…ŒμŠ€νŠΈ 넀이밍

step1 testnaming2

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λͺ…λͺ…ν•  λ•ŒλŠ” μ•Œμ•„μ±„μ§€ λͺ» ν–ˆλŠ”λ° ν”Όλ“œλ°±μ„ λ°›μœΌλ‹ˆ λ°”λ‘œ λ¬Έμ œμ μ„ 찾을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 리뷰어 λΆ„μ˜ ν”Όλ“œλ°±λŒ€λ‘œ 과거의 μ½”λ“œλ₯Ό ν˜„μž¬ ν…ŒμŠ€νŠΈ ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μ œμ•ˆν•΄μ£Όμ‹  λͺ…λͺ…법이 가독성과 λͺ…ν™•μ„± λ‘˜ λ‹€ λ›°μ–΄λ‚˜λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

step1 testnaming

이 뢀뢄은 μ‹€μ œ μ½”λ“œκ°€ μ•„λž˜μ™€ 같이 κ΅¬μ„±λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

it('μŒμˆ˜μ™€ 곡백을 μ‹œλ„ 횟수둜 μž…λ ₯ μ‹œ, 경고메세지가 좜λ ₯λ˜λŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.', () => {
  const negativeRacingCount = -7
  const alertStub = cy.stub()

  cy.on('window:alert', alertStub)
  typeCarNameAndClickToSubmitButton()
  typeRacingCountAndClickToSubmitButton(negativeRacingCount).then(() => {
    expect(alertStub.getCall(0)).to.be.calledWith(
      '1 μ΄μƒμ˜ 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.'
    )
    cy.get('#racing-count-input').should('have.text', '')
  })

  cy.get('#racing-count-submit')
    .click()
    .then(() => {
      expect(alertStub.getCall(1)).to.be.calledWith(
        '1 μ΄μƒμ˜ 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.'
      )
      cy.get('#racing-count-input').should('have.text', '')
    })
})

μ‹€μ œλ‘œλŠ” nagative μΌ€μ΄μŠ€λ“€μ„ ν…ŒμŠ€νŠΈ ν•˜λŠ” μ½”λ“œμ˜€λŠ”λ° 'μ–‘μ˜ μ •μˆ˜λ§Œμ„ μ‹œλ„νšŸμˆ˜λ‘œ μž…λ ₯ν•  수 μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈ ν•œλ‹€.'λΌλŠ” 기쑴의 이름은 μ‹€μ œ μž‘λ™ν•˜λŠ” ν…ŒμŠ€νŠΈμ™€λŠ” 거리가 μžˆλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€.

ν”Όλ“œλ°±μ„ ν† λŒ€λ‘œ ν…ŒμŠ€νŠΈλ“€μ˜ 이름을 μˆ˜μ •ν–ˆλŠ”λ° 훨씬 역할이 λͺ…ν™•ν•˜κ²Œ λ³΄μ΄λŠ”κ²Œ λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€.

2-4 default parameter

step1 defaultparam

리뷰어 λΆ„μ˜ λ§λŒ€λ‘œ λ²”μš©μ„±μ„ μƒκ°ν•˜λ©΄ default parameterλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  인자λ₯Ό 전달 λ°›λŠ”κ²Œ 훨씬 λ‚˜μ„κ±°λΌλŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€. utils 폴더에 μƒμ„±ν•œ 것도 λ²”μš©μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•¨μ΄μ—ˆλŠ”λ° default parameterλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ œν•œμ μœΌλ‘œ μ‚¬μš©λœλ‹€λŠ” 점을 μƒκ°ν•˜μ§€ λͺ» ν–ˆμŠ΅λ‹ˆλ‹€. ν”Όλ“œλ°±μ„ λ°˜μ˜ν•΄ default parameterλ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

3. 링크


Written by@yujo
πŸ“ 배우고 λŠλ‚€ 점을 κΈ°λ‘ν•˜κ³  κ³΅μœ ν•˜λŠ” λΈ”λ‘œκ·Έ

GitHub